import { TRUSTED_DOMAINS } from '@/lib/constants/bottom-navigation'
import type { LinkSecurityResult } from '@/lib/types/bottom-navigation'

/**
 * 链接安全验证工具
 * 提供URL安全性检查和验证功能
 */

/**
 * 检查URL是否为受信任的域名
 * @param url 要检查的URL
 * @returns 是否为受信任的域名
 */
export function isTrustedDomain(url: string): boolean {
  try {
    const urlObj = new URL(url)
    const hostname = urlObj.hostname.toLowerCase()
    
    return TRUSTED_DOMAINS.some(domain => 
      hostname === domain || hostname.endsWith(`.${domain}`)
    )
  } catch {
    return false
  }
}

/**
 * 检查URL是否使用安全协议
 * @param url 要检查的URL
 * @returns 是否使用安全协议
 */
export function isSecureProtocol(url: string): boolean {
  try {
    const urlObj = new URL(url)
    return urlObj.protocol === 'https:' || urlObj.protocol === 'mailto:'
  } catch {
    return false
  }
}

/**
 * 检测可疑的URL模式
 * @param url 要检查的URL
 * @returns 安全警告列表
 */
export function detectSuspiciousPatterns(url: string): string[] {
  const warnings: string[] = []
  
  try {
    const urlObj = new URL(url)
    
    // 检查是否有可疑的子域名
    const suspiciousSubdomains = ['admin', 'secure', 'login', 'auth', 'pay']
    const hostname = urlObj.hostname.toLowerCase()
    
    if (suspiciousSubdomains.some(sub => hostname.includes(sub)) && !isTrustedDomain(url)) {
      warnings.push('包含可疑的子域名')
    }
    
    // 检查是否有URL缩短服务
    const shorteners = ['bit.ly', 'tinyurl.com', 't.co', 'goo.gl', 'ow.ly']
    if (shorteners.some(shortener => hostname.includes(shortener))) {
      warnings.push('使用了URL缩短服务')
    }
    
    // 检查是否有过长的URL（可能是钓鱼攻击）
    if (url.length > 200) {
      warnings.push('URL过长，可能存在风险')
    }
    
    // 检查是否有多次重定向参数
    const redirectParams = ['redirect', 'url', 'goto', 'next', 'return']
    const searchParams = urlObj.searchParams
    
    let redirectCount = 0
    redirectParams.forEach(param => {
      if (searchParams.has(param)) {
        redirectCount++
      }
    })
    
    if (redirectCount > 1) {
      warnings.push('包含多个重定向参数')
    }
    
  } catch {
    warnings.push('URL格式无效')
  }
  
  return warnings
}

/**
 * 综合安全检查
 * @param url 要检查的URL
 * @returns 安全检查结果
 */
export function checkLinkSecurity(url: string): LinkSecurityResult {
  const isTrusted = isTrustedDomain(url)
  const isSecure = isSecureProtocol(url)
  const warnings = detectSuspiciousPatterns(url)
  
  return {
    isSecure,
    isTrusted,
    warnings
  }
}

/**
 * 创建安全的链接属性
 * @param url 链接URL
 * @returns 安全的链接属性对象
 */
export function createSecureLink(url: string) {
  const security = checkLinkSecurity(url)
  
  // 基础属性
  const linkProps: Record<string, string> = {
    href: url,
    target: '_blank'
  }
  
  // 根据信任级别设置rel属性
  if (security.isTrusted) {
    linkProps.rel = 'noopener'
  } else {
    linkProps.rel = 'noopener noreferrer nofollow'
  }
  
  return {
    ...linkProps,
    security,
    onClick: (e: MouseEvent) => {
      // 如果有安全警告，显示确认对话框
      if (security.warnings.length > 0) {
        const warningMessage = `此链接可能存在以下风险：\n${security.warnings.join('\n')}\n\n确定要继续访问吗？`
        
        if (!confirm(warningMessage)) {
          e.preventDefault()
          return false
        }
      }
      
      // 记录链接点击事件
      trackLinkClick(url, security)
      return true
    }
  }
}

/**
 * 记录链接点击事件（用于监控）
 * @param url 被点击的URL
 * @param security 安全检查结果
 */
function trackLinkClick(url: string, security: LinkSecurityResult) {
  // 这里可以集成实际的监控系统
  if (typeof window !== 'undefined') {
    console.info('Link clicked:', {
      url,
      isTrusted: security.isTrusted,
      isSecure: security.isSecure,
      warningsCount: security.warnings.length,
      timestamp: Date.now()
    })
  }
}

/**
 * 显示安全警告提示
 * @param url 链接URL
 * @param warnings 警告列表
 */
export function showSecurityWarning(url: string, warnings: string[]) {
  const message = `安全提醒：\n\n链接：${url}\n\n发现以下风险：\n${warnings.join('\n')}\n\n建议谨慎访问此链接。`
  
  if (typeof window !== 'undefined') {
    alert(message)
  }
} 